package com.chebaohui.iqs.service.impl.deal.bihu.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLEncoder;

import org.apache.commons.lang.ArrayUtils;

import com.chebaohui.iqs.service.impl.deal.bihu.entity.req.ReqCommon;

/**
 * 工具类 获得访问地址
 * 
 * @author yuanxu
 *
 */
public class GetUrlUtil {
	/**
	 * 获取全新地址访问链接
	 * 
	 * @param cc
	 *            传入的一个javabean
	 * @param url
	 *            传入访问的主地址
	 * @return 返回一个全新的地址
	 * @throws Exception
	 */
	public static String getUrl(ReqCommon cc, String url) throws Exception {
		// 创建一个可变的字符窜，装入元素
		StringBuilder sb = new StringBuilder();
		// 定义一个字符串获得秘钥值
		String newout = null;
		// 传入参数javabean的反射机制获得父类 类类型
		Class<?> superclass = cc.getClass().getSuperclass();
		// 子类与父类反射机制获取全部属性
		Field[] fields = (Field[]) ArrayUtils.addAll(cc.getClass().getDeclaredFields(), superclass.getDeclaredFields());
		// 遍历
		for (Field field : fields) {
			// 反射机制获取所有getter方法
			Method m = (Method) cc.getClass().getMethod("get" + field.getName());
			// 调用javabean get方法获取值
			Object val = m.invoke(cc);
			// 去除 值为空以及秘钥(Seccode)的值（根据接口文档 拼接地址链接要求）
			if (val != null && !(field.getName().equalsIgnoreCase("seccode"))) {
				sb.append(field.getName() + "=" + val + "&");
			}
			// 单独获得秘钥的值
			if (val != null && field.getName().equalsIgnoreCase("seccode")) {
				newout = val + "";
			}
		}
		// 去除末尾多余的“&”的符号
		String out = sb.toString().substring(0, sb.length() - 1);
		// md5加密
		String md5 = MD5Util.getMD5(out + newout);
		// 访问的链接
		String outurl = url + "?" + getValue(out) + "&Seccode=" + md5;

		return outurl;

	}

	/**
	 * 对厂牌型号进行转码
	 * 
	 * @param out
	 * @return
	 * @throws Exception
	 */
	private static String getValue(String out) throws Exception {
		StringBuilder sb = new StringBuilder();
		String[] vs = out.split("&");
		for (String v : vs) {
			String[] cv = v.split("=");
			if (cv[0].equals("MoldName"))
				sb.append(cv[0] + "=" + URLEncoder.encode(cv[1], "UTF-8") + "&");
			else
				sb.append(cv[0] + "=" + cv[1] + "&");
		}

		return sb.toString().substring(0, sb.length() - 1);
	}

}
